home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Fonts / font_conversion / mfrc / Source / mfrc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-12  |  6.5 KB  |  226 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <strings.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6.  
  7. #include "mfrc.h"
  8.  
  9. int cmpid(rl1,rl2)
  10. ref_list *rl1, *rl2;
  11. {
  12.     return rl1->id - rl2->id;
  13. }
  14.  
  15. int main(argc,argv)
  16. int argc;
  17. char **argv;
  18. {
  19.     char *progname;
  20.     FILE *fp, *of;
  21.     info_header infobuf;
  22.     type_info typbuf;
  23.     ref_list *rfptr, *rfent;
  24.     unsigned char *pdata, *cp, *cp2;
  25.     char onm[BUFSIZ], anm[BUFSIZ];
  26.     unsigned long rsrc,rsd,rsm;
  27.     long rslen;
  28.     unsigned short rstl;
  29.     short rstypes;
  30.     int c,len;
  31.  
  32.     progname = argv[0];
  33.     if (argc < 2) {
  34.         fprintf(stderr, "Usage: %s file ...\n", progname);
  35.         exit(1);
  36.     }
  37.  
  38.     while (--argc) {
  39.         ++argv;
  40.         fp = fopen(*argv,"r");
  41.         if (fp == NULL) {
  42.             perror(*argv);
  43.             continue;
  44.         }
  45.  
  46.         fprintf(stderr,"%s: ",*argv);
  47.         if (fread(&infobuf,sizeof(info_header),1,fp) < 1 ) {
  48.             fclose(fp);
  49.             fprintf(stderr,"No header\n");
  50.             continue;
  51.         }
  52.  
  53.         if (infobuf.version || infobuf.nlen) {
  54.             rsrc = sizeof(info_header) + (infobuf.dlen[0]<<24) +
  55.               (infobuf.dlen[1]<<16) + (infobuf.dlen[2]<<8) +
  56.               infobuf.dlen[3];
  57.  
  58.             if ((infobuf.type[0]!='L') || (infobuf.type[1]!='W')
  59.               || (infobuf.type[2]!='F')
  60.               || (infobuf.type[3]!='N')) {
  61.                 fclose(fp);
  62.                 fprintf(stderr,"File not type LWFN.\n");
  63.                 continue;
  64.             }
  65.  
  66.             if (rsrc > sizeof(info_header))
  67.                 fseek(fp,rsrc,SEEK_SET);
  68.         }
  69.         else rsrc = 0;
  70.  
  71.         fread(&rsd,4,1,fp);
  72.         fread(&rsm,4,1,fp);
  73.         fseek(fp,rsrc+rsm+24,SEEK_SET);
  74.         fread(&rstl,2,1,fp);
  75.         fseek(fp,rsrc+rsm+rstl,SEEK_SET);
  76.         fread(&rstypes,2,1,fp);
  77.  
  78.         while (rstypes >= 0) {
  79.             fread(&typbuf,sizeof(typbuf),1,fp);
  80.             if (typbuf.rtype == POST_TYPE)
  81.                 break;
  82.             --rstypes;
  83.         }
  84.  
  85.         if (rstypes < 0) {
  86.             fclose(fp);
  87.             fprintf(stderr,"No POST resources.\n");
  88.             continue;
  89.         }
  90.  
  91.         /* Read list of POST resources and sort by resource ID */
  92.         fseek(fp,rsrc+rsm+rstl+typbuf.offset,SEEK_SET);
  93.         rfptr = (ref_list *)malloc(sizeof(ref_list) * (typbuf.nrsc+1));
  94.         fread(rfptr,sizeof(ref_list),typbuf.nrsc+1,fp);
  95.         qsort(rfptr,typbuf.nrsc+1,sizeof(ref_list),cmpid);
  96.  
  97.         /* Process POST resources */
  98.         of=NULL;
  99.         onm[0] = '\0';
  100.         rfent = rfptr;
  101.         len=0;
  102.         while (typbuf.nrsc-- >= 0) {
  103.             fseek(fp,rsrc+rsd+(rfent->offset & 0xffffff),SEEK_SET);
  104.             fread(&rslen,4,1,fp);
  105.             pdata = (unsigned char *)malloc(rslen);
  106.             fread(pdata,rslen,1,fp);
  107.             switch (pdata[0]) {
  108.                 case POST_TEXT:
  109.                     if (!of) {
  110.                         cp=pdata+2;
  111.                         while (cp < pdata+rslen) {
  112.                             if (*cp == '/') {
  113.                                 if (!strncmp((char *)cp,"/FontName",9)) {
  114.                                     cp += 9;
  115.                                     if (isspace(*cp)) {
  116.                                         while (*cp++ != '/');
  117.                                         cp2=(unsigned char *)onm;
  118.                                         while (!isspace((char)*cp))
  119.                                             *cp2++ = *cp++;
  120.                                         *cp2 = '\0';
  121.                                         break;
  122.                                     }
  123.                                 }
  124.                             }
  125.                             cp++;
  126.                         }
  127.                         if (!onm[0])
  128.                             sprintf(onm,"%s.psf",*argv);
  129.                         of=fopen(onm,"w");
  130.                         if (!of) {
  131.                             perror(onm);
  132.                             free(pdata);
  133.                             fprintf(stderr,"%s: ",*argv);
  134.                             continue;
  135.                         }
  136.                     }
  137.                     cp=pdata+2;
  138.                     while (cp < pdata+rslen) {
  139.                         if (*cp == '\r')
  140.                             *cp='\n';
  141.                         cp++;
  142.                     }
  143.                     if (len) {
  144.                         fprintf(of,"\n");
  145.                         len=0;
  146.                     }
  147.                     fwrite(pdata+2,rslen-2,1,of);
  148.                     break;
  149.                 case POST_DATA:
  150.                     if (!of) {
  151.                         fprintf(stderr, "Data before text.\n");
  152.                         free(pdata);
  153.                         fprintf(stderr,"%s: ",*argv);
  154.                         continue;
  155.                     }
  156.                     cp=pdata+2;
  157.                     while (cp < pdata+rslen) {
  158.                         fprintf(of,"%02x",*cp++);
  159.                         if (++len > 31) {
  160.                             fprintf(of,"\n");
  161.                             len = 0;
  162.                         }
  163.                     }
  164.                     break;
  165.                 case POST_END:
  166.                     break;
  167.                 default:
  168.                     fprintf(stderr, "Unknown POST resource type %d.\n",
  169.                             pdata[0]);
  170.             } /* end switch */
  171.             free(pdata);
  172.             ++rfent;
  173.         } /* while more POST resources */
  174.         if (len)
  175.             fprintf(of,"\n");
  176.         fclose(of);
  177.         fclose(fp);
  178.         free(rfptr);
  179.  
  180.         /* check for afm file */
  181.         if (!onm[0]) {
  182.             fprintf(stderr,"no font data.\n");
  183.             continue;
  184.         }
  185.         fprintf(stderr,"converted to %s.\n",onm);
  186.         strcpy(anm,*argv);
  187.         strcat(anm,".afm");
  188.         fp=fopen(anm,"r");
  189.         if (!fp)
  190.             continue;
  191.  
  192.         if (fread(&infobuf,sizeof(info_header),1,fp) < 1) {
  193.             fclose(fp);
  194.             continue;
  195.         }
  196.  
  197.         if (infobuf.version || infobuf.nlen) {
  198.             rslen = (infobuf.dlen[0]<<24) + (infobuf.dlen[1]<<16)
  199.               + (infobuf.dlen[2]<<8) + infobuf.dlen[3];
  200.             if (rslen < 1) {
  201.                 fclose(fp);
  202.                 continue;
  203.             }
  204.         }
  205.         else rslen=0;
  206.  
  207.         strcat(onm,".afm");
  208.         of=fopen(onm,"w");
  209.         if (!of) {
  210.             fclose(fp);
  211.             continue;
  212.         }
  213.         do {
  214.             c=getc(fp);
  215.             if (c=='\r')
  216.                 putc('\n',of);
  217.             else
  218.                 putc(c,of);
  219.         } while (--rslen);
  220.         fclose(of);
  221.         fclose(fp);
  222.     } /* while more files */
  223.  
  224.     return 0;
  225. } /* end main */
  226.